#ifndef DATACENTER_H
#define DATACENTER_H

#include "data.h"
#include "../network/netclient.h"

#include <QWidget>

namespace model
{

// DataCenter 类
// 1. 管理所有客⼾端需要的数据
// 2. 单例类
// 3. 继承QObject，使用信号槽机制
class DataCenter : public QObject
{
    Q_OBJECT
public:
    static DataCenter* getInstance();
    ~DataCenter();

private:
    DataCenter();
    static DataCenter* instance;

    // 以下罗列的均是 DataCenter 中要组织管理的所有的数据

    // 1. 当前客户端登录到服务器对应的登录会话 id
    //  这个信息是登录成功后, 服务器返回的.
    //  返回之后这个数据需要被客⼾端持久化保存在⽂件中.
    //  后续每次启动, 都从⽂件中拿到这个内容.
    //  当⽤⼾显式点击 "退出登录", 则删除这个信息.
    QString loginSessionId = "";

    // 2. 当前的用户信息
    UserInfo* myself = nullptr;

    // 3. 好友列表
    //    关于QList<UserInfo>*的设计：在从服务器获取到内容之前用nullptr表明字段是无效值
    QList<UserInfo>* friendList = nullptr;

    // 4. 会话列表
    QList<ChatSessionInfo>* chatSessionList = nullptr;

    // 5. 记录当前选中的会话是哪个~~
    QString currentChatSessionId = "";

    // 6. 记录每个会话中, 都有哪些成员(主要针对群聊).
    //    key 为 chatSessionId, value 为成员列表
    QHash<QString, QList<UserInfo>>* memberList = nullptr;

    // 7. 待处理的好友申请列表
    QList<UserInfo>* applyList = nullptr;

    // 8. 每个会话的最近消息列表, key 为 chatSessionId, value 为消息列表
    QHash<QString, QList<Message>>* recentMessages = nullptr;

    // 9. 存储每个会话, 未读消息的个数. key 为 chatSessionId, value 为未读消息的个数.
    QHash<QString, int>* unreadMessageCount = nullptr;

    // 10. 用户的好友搜索结果.
    QList<UserInfo>* searchUserResult = nullptr;

    // 11. 历史消息搜索结果.
    QList<Message>* searchMessageResult = nullptr;

    // 12. 短信验证码的验证 id
    QString currentVerifyCodeId = "";

    // 13. 让 DataCenter 持有 NetClient 实例.
    network::NetClient netClient;

public:
    // 以下方法主要用于DataCenter数据的持久化存储
    // 初始化数据⽂件
    void initDataFile();
    // 保存必要的数据到⽂件
    void saveDataFile();
    // 从⽂件加载必要的数据
    void loadDataFile();

signals:
}; // end class

} // end namespace

#endif // DATACENTER_H
